package com.ruoyi.aitcommon.utils;

import java.io.File;
import java.util.Map;

import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;

/**
 * 封装hutool http工具类,提供对rest api的调用
 * 放弃 kong.unirest.Unirest 工具类
 * @author Administrator
 *
 */
public class RestServiceUtils extends RestServiceBase{

	/**
	 * POST调用
	 * @param url url地址
	 * @param jsonstr JSON字符串,作为POST BODY
	 * @return BODY返回字符串
	 */
	public static String post(String url, String jsonstr) throws Exception {
		return post(url, null, jsonstr);
	}

	public static JSONObject post(String url, JSONObject json) throws Exception {
		return post(url, null, json);
	}

	/**
	 * POST调用
	 * @param url url地址
	 * @param head head头信息
	 * @param json JSON对象,作为POST BODY
	 * @return BODY返回JSON对象
	 * @throws Exception
	 */
	public static JSONObject post(String url,Map<String,Object> head, JSONObject json) throws Exception {
		String jsonstr = JSONObject.toJSONStringWithDateFormat(json, "yyyy-MM-dd HH:mm:ss");
		String retstr = post(url, head, jsonstr);
		return JSONObject.parseObject(retstr);
	}

	/**
	 * POST调用
	 * @param url url地址
	 * @param head head头信息
	 * @param jsonstr JSON字符串,作为POST BODY
	 * @return BODY返回字符串
	 */
	public static String post(String url, Map<String, Object> head, String jsonstr) throws Exception {
//		构造调用方法
		HttpRequest request = HttpRequest.post(url);
//		远程调用
		return restInvoke(request,jsonstr,head);
	}

	/**
	 * POST调用
	 * @param url url地址
	 * @param query 查询参数
	 * @param head head头信息
	 * @param jsonstr JSON字符串,作为POST BODY
	 * @return BODY返回字符串
	 */
	public static String post(String url,Map<String, Object> query, Map<String, Object> head, String jsonstr) throws Exception {
//		构造url+查询地址
		String parmstr=queryParam(query);
		if(StrUtil.isNotBlank(parmstr)) {
			url+="?"+parmstr;
		}
//		构造调用方法
		HttpRequest request = HttpRequest.post(url);
//		远程调用
		return restInvoke(request,jsonstr,head);
	}

	/**
	 * PUT调用
	 * @param url url地址
	 * @param head head头信息
	 * @param jsonstr JSON字符串,作为POST BODY
	 * @return BODY返回字符串
	 */
	public static String put(String url,Map<String,Object> head,String jsonstr) throws Exception {
		//		构造调用方法
		HttpRequest request = HttpRequest.put(url);
//		远程调用
		return restInvoke(request,jsonstr,head);
	}

	/**
	 * get调用
	 * @param url url地址
	 * @param head head头信息
	 * @param query 查询参数
	 * @return 返回BODY字符串
	 */
	public static String get(String url,Map<String,Object> head,Map<String,Object> query) throws Exception {
//		构造url+查询地址
		String parmstr=queryParam(query);
		if(StrUtil.isNotBlank(parmstr)) {
			url+="?"+parmstr;
		}
		
//		构造调用方法
		HttpRequest request = HttpRequest.get(url);
//		调用远程
		return restInvoke(request,null,head);
	}
	
	/**
	 * get调用
	 * @param url url地址
	 * @param query 调用参数,可以为空
	 * @return BODY内容,JSON对象
	 */
	public static JSONObject getJSON(String url,Map<String,Object> head,Map<String,Object> query) throws Exception {
		String retstr = get(url,head,query);
		return JSONObject.parseObject(retstr);
	}

	public static String postFile(String url,Map<String,Object> head,String name, File file) {
		//		构造调用方法
		HttpRequest request = HttpRequest.post(url);
//			设置HTTP头部信息
		if (head != null&&head.size()>0) {
			for (String key : head.keySet()) {
				String val = head.get(key).toString();
				request = request.header(key, val);
			}
		}
		request.form(name, file);
		StringBuilder logstr=new StringBuilder();
		logstr.append("HTTP调用:[postFile]");
		logstr.append("调用地址:"+url);
		logstr.append("文件地址:"+file.getAbsolutePath());
		//日志一次性输出,确保并发调用时,日志不会乱
		LogUtils.httpInfo(logstr.toString());
//		远程调用
		HttpResponse response = request.execute();
//		返回处理
		LogUtils.info("调用返回:"+response.body());
		return response.body();
	}
}
